package mybatisplus;

import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
import com.baomidou.mybatisplus.core.toolkit.StringPool;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.InjectionConfig;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.converts.MySqlTypeConvert;
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
import com.baomidou.mybatisplus.generator.config.rules.DbColumnType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;

import java.util.Collections;
import java.util.Scanner;

public class CodeGenerator {

    public static void main(String[] args) {
        String projectPath = System.getProperty("user.dir") + "/MyBatis-Plus";

        // 如果模板引擎是 freemarker
        String templatePath = "/templates/mapper.xml.ftl";
        // 如果模板引擎是 velocity
        // String templatePath = "/templates/mapper.xml.vm";

        // 代码生成器
        AutoGenerator mpg = new AutoGenerator()
                .setGlobalConfig(
                        // 全局配置
                        new GlobalConfig()
                                .setOutputDir(projectPath + "/src/main/java")
                                .setAuthor("jhxxb")
                                .setOpen(false)
                                // .setEnableCache(false) // XML 二级缓存
                                .setBaseResultMap(true) // XML ResultMap
                                .setBaseColumnList(true) // XML columList
                                .setFileOverride(true) // 是否覆盖文件
                                // 自定义文件命名， %s 为占位符
                                // .setMapperName("%sMapper")
                                // .setXmlName("%sMapper")
                                // .setServiceName("%sService")
                                // .setServiceImplName("%sServiceImpl")
                                // .setControllerName("%sController")
                                .setEntityName("%sEntity")
                )
                .setDataSource(
                        // 数据源配置
                        new DataSourceConfig()
                                .setTypeConvert(new MySqlTypeConvert() {
                                    // 自定义数据库表字段类型转换
                                    @Override
                                    public DbColumnType processTypeConvert(GlobalConfig globalConfig, String fieldType) {
                                        System.out.println("转换类型：" + fieldType);
                                        if (fieldType.toLowerCase().contains("tinyint")) {
                                            return DbColumnType.BOOLEAN;
                                        }
                                        return (DbColumnType) super.processTypeConvert(globalConfig, fieldType);
                                    }
                                }).setUrl("jdbc:mysql://192.168.8.200:3306/picamp?useUnicode=true&useSSL=false&characterEncoding=utf8")
                                .setDriverName("com.mysql.cj.jdbc.Driver")
                                .setUsername("root")
                                .setPassword("root")
                ).setPackageInfo(
                        // 包配置
                        new PackageConfig()
                                // .setModuleName(scanner("模块名"))
                                .setParent("org") // 自定义包路径
                                .setController("controller") // 控制器包名
                ).setCfg(
                        new InjectionConfig() {
                            @Override
                            public void initMap() {
                                // Map<String, Object> map = new HashMap<>();
                                // this.setMap(map);
                            }
                        }.setFileOutConfigList(Collections.singletonList(
                                new FileOutConfig("/templates/mapper.xml.ftl") {
                                    @Override
                                    public String outputFile(TableInfo tableInfo) {
                                        // 自定义输出文件名 ， 如果 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化！！
                                        return projectPath + "/src/main/resources/mapper/" + tableInfo.getMapperName() + StringPool.DOT_XML;
                                    }
                                }
                        ))
                ).setTemplate(
                        // 配置模板
                        new TemplateConfig()
                                // 指定自定义模板路径，注意不要带上 .ftl/.vm, 会根据使用的模板引擎自动识别
                                // .setController("...")
                                // .setEntity("...")
                                // .setMapper("...")
                                // .setService(null)
                                // .setServiceImpl(null)
                                .setXml(null) // 自定义了 xml 的生成路径,这里设置为 null,避免重复生成
                ).setStrategy(
                        // 策略配置
                        new StrategyConfig()
                                .setNaming(NamingStrategy.underline_to_camel) // //表名生成策略,下划线转驼峰
                                .setColumnNaming(NamingStrategy.underline_to_camel)
                                .setEntityLombokModel(true) // 是否为 lombok 模型
                                .setRestControllerStyle(true) // 生成 @RestController 控制器
                                .setTablePrefix(new String[]{"t_", "mp_"}) // 要生成表的前缀,生成时会去掉前缀
                                // .setExclude(new String[]{"test"}) // 排除生成的表
                                .setInclude(scanner("表名，多个英文逗号分割").split(",")) // 需要生成的表
                ).setTemplateEngine(
                        // 切换为 freemarker 模板引擎，默认 velocity 模板引擎
                        new FreemarkerTemplateEngine()
                );
        mpg.execute();
    }

    /**
     * 读取控制台内容
     */
    public static String scanner(String tip) {
        Scanner scanner = new Scanner(System.in);
        StringBuilder help = new StringBuilder();
        help.append("请输入" + tip + "：");
        System.out.println(help.toString());
        if (scanner.hasNext()) {
            String ipt = scanner.next();
            if (StringUtils.isNotBlank(ipt)) {
                return ipt;
            }
        }
        throw new MybatisPlusException("请输入正确的" + tip + "！");
    }
}
